﻿using Entidades;
using System;
using CapaDatos;
using System.Collections.Generic;

namespace ModuloVentas
{
    public class AdministradorVentas
    {
        public AdministradorVentas()
        { 
        
        }

        /// <summary>
        /// Crea los datos adicionales de un cliente.
        /// </summary>
        /// <param name="codcli"></param>
        public static void CrearDatosSiNoExisten(int codcli)
        {
            var phantom = CapaDatos.Datos.Phantom;
            var cliente = (Entity_cliente)phantom.Cargar(
                typeof(Entity_cliente), 
                string.Format("codcliente={0} AND empresa_idempresa={1}", codcli, ModuloSoporte.Global.CodEmpresa));

            var otrosdatos = new Entity_clienteotrosdatos
            {
                Cliente_codcliente = codcli,
                Cliente_empresa_idempresa = cliente.Empresa_idempresa
            };

            if (!phantom.Existe(otrosdatos))
            {
                phantom.Insertar(otrosdatos);
            }

            var datosimpositivos = new Entity_clientedatosimpositivos
            {
                Cliente_codcliente = codcli,
                Cliente_empresa_idempresa = cliente.Empresa_idempresa,
                Situacioniva = Documento.DefaultSituacionIva
            };

            if (!phantom.Existe(datosimpositivos))
            {
                phantom.Insertar(datosimpositivos);
            }
             
        }

        /// <summary>
        /// Registra un nuevo comprobante de venta.
        /// </summary>
        /// <param name="bienDeUso"></param>
        /// <param name="codCliente"></param>
        /// <param name="codMoneda"></param>
        /// <param name="descuento"></param>
        /// <param name="idCondicionVenta"></param>
        /// <param name="fecha"></param>
        /// <param name="fechaCambio"></param>
        /// <param name="fechaContabilizacion"></param>
        /// <param name="tipo">Tipo de comprobante (ticket, factura, etc.).</param>
        /// <param name="letra"></param>
        /// <param name="numeroSuc"></param>
        /// <param name="tipoOperacion"></param>
        /// <param name="codProvincia"></param>
        /// <returns></returns>
        public static int IngresarComprobanteVenta(
            bool bienDeUso, int codCliente, int codMoneda, float descuento,
            int idCondicionVenta, DateTime fecha, DateTime fechaCambio, 
            DateTime fechaContabilizacion, TipoComprobante tipo, string letra,
            int idpuntoventa,int numeroSuc, int tipoOperacion, int codProvincia,
            List<ItemComprobante> items)
        {
            try
            {
                Datos.PrepararTransaccion(true);

                Entity_comprobantesventa comprobante = new Entity_comprobantesventa
                {
                    Biendeuso = bienDeUso,
                    Cambiomoneda_fechacambio = fechaCambio,
                    Cambiomoneda_moneda_idmoneda = codMoneda,
                    Cliente_codcliente = codCliente,
                    Cliente_empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                    Condicionventa_idcondicionventa = idCondicionVenta,
                    Descuento = descuento,
                    Empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                    Fecha = fecha,
                    Fechacontabilizacion = fechaContabilizacion,
                    Tipocomprobante = (int)tipo,
                    Letra = letra,
                    Numerosuc = numeroSuc,
                    Provincia_codprov = codProvincia,
                    Tipooperacioncomprobante_empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                    Tipooperacioncomprobante_idtipooperacioncomprobante = tipoOperacion,
                    Puntoventa_empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                    Puntoventa_idpuntoventa = idpuntoventa
                };
                Datos.Manejador[Names.DbSisContTrans].Insertar(comprobante);
                int numero = int.Parse(Datos.Retorno.ToString());

                Datos.PrepararTransaccion(false);
                foreach (var item in items)
                {
                    if (item.Tipo.Equals("S"))
                    {
                        var entity = new Entity_servicio_has_comprobantesventa
                        {
                            Servicio_idservicio = item.Codigo,
                            Servicio_sucursal_codigosucursal = ModuloSoporte.Global.CodSucursal,
                            Servicio_sucursal_empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                            Comprobantesventa_empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                            Comprobantesventa_idcomprobantesventa = numero                            
                        };

                        Datos.Manejador[Names.DbSisContTrans].Insertar(entity);
                    }
                    else if (item.Tipo.Equals("P"))
                    {
                        var entity = new Entity_comprobantesventa_has_producto
                        {
                            Cantidad = item.Cantidad,
                            Producto_idproducto = item.Codigo,
                            Producto_sucursal_codigosucursal = ModuloSoporte.Global.CodSucursal,
                            Producto_sucursal_empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                            Comprobantesventa_empresa_idempresa = ModuloSoporte.Global.CodEmpresa,
                            Comprobantesventa_idcomprobantesventa = numero
                        };

                        Datos.Manejador[Names.DbSisContTrans].Insertar(entity);
                    }
                }

                Datos.Commit();
                Datos.Release();
                return numero;
            }
            catch(Exception ex)
            {
#if DEBUG
                System.Diagnostics.Debug.WriteLine(ex.Message);
#endif
                Datos.Rollback();
                Datos.Release();
                return -1;
            }
        }

        public static object[] ObtenerListadoClientes()
        {
            var tipo = typeof(Entity_cliente);
            var lista = Gestor<Entity_cliente>.Listar(string.Format("Empresa_idempresa={0} AND Habilitado=1", ModuloSoporte.Global.CodEmpresa));
            object[] objetos = new object[lista.Count];
            int i = 0;
            foreach (var elem in lista)
            {
                objetos[i++] = new object[] { elem.Codcliente, elem.Razonsocial };
            }
            return objetos;
        }

        public static object ObtenerListadoMonedas()
        {
            var tipo = typeof(Entity_moneda);
            var lista = Gestor<Entity_moneda>.Listar();
            object[] objetos = new object[lista.Count];
            int i = 0;
            foreach (var elem in lista)
            {
                objetos[i++] = new object[] { elem.Idmoneda, elem.Moneda+" - "+elem.Simbolo };
            }
            return objetos;
        }

        public static object ObtenerListadoTiposOperacion()
        {
            var tipo = typeof(Entity_tipoOperacionComprobante);
            var lista = Gestor<Entity_tipoOperacionComprobante>.Listar(string.Format("Empresa_idempresa={0}", ModuloSoporte.Global.CodEmpresa));
            object[] objetos = new object[lista.Count];
            int i = 0;
            foreach (var elem in lista)
            {
                objetos[i++] = new object[] { elem.Idtipooperacioncomprobante, elem.Descripcion };
            }
            return objetos;
        }

        public static object ObtenerCondicionVenta()
        {
            var tipo = typeof(Entity_condicionventa);
            var lista = Gestor<Entity_condicionventa>.Listar();
            object[] objetos = new object[lista.Count];
            int i = 0;
            foreach (var elem in lista)
            {
                objetos[i++] = new object[] { elem.Idcondicionventa, elem.Descripcion };
            }
            return objetos;
        }

        public static object ObtenerListadoProvincias()
        {
            var tipo = typeof(Entity_provincia);
            var lista = Gestor<Entity_provincia>.Listar();
            object[] objetos = new object[lista.Count];
            int i = 0;
            foreach (var elem in lista)
            {
                objetos[i++] = new object[] { elem.Codprov, elem.Descripcion };
            }
            return objetos;
        }

        public static object ObtenerPuntosVenta()
        {
            var tipo = typeof(Entity_puntoventa);
            var lista = Gestor<Entity_puntoventa>.Listar();
            object[] objetos = new object[lista.Count];
            int i = 0;
            foreach (var elem in lista)
            {
                objetos[i++] = new object[] { 
                    elem.Idpuntoventa,
                    elem.Numero,
                    elem.Descripcion,
                    string.Format("{0}. (Cod {1}) {2}", elem.Idpuntoventa, elem.Numero, elem.Descripcion)
                };
            }
            return objetos;
        }
    }//clase
}//namespace
